package com.sky.properties;

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import com.alipay.easysdk.kernel.Config;
import com.alipay.easysdk.factory.Factory;
import javax.annotation.PostConstruct;

/**
 * 配置支付宝相关的信息，使用Spring Boot的@ConfigurationProperties自动绑定配置文件中的属性。
 * 此配置类用于加载支付宝支付所需的配置信息，并在应用启动时初始化支付宝SDK。
 */
@Data
@Component
@ConfigurationProperties(prefix = "alipay")
public class MyAliPayConfig {

    /**
     * 应用ID，开发者在支付宝开放平台创建应用后获得。
     */
    private String appId;

    /**
     * 应用私钥，开发者生成并保存在服务器端，用于对请求签名。
     */
    private String appPrivateKey;

    /**
     * 支付宝公钥，用于验证支付宝返回的数据签名。
     */
    private String alipayPublicKey;

    /**
     * 异步通知地址，当交易状态发生变化时，支付宝会向该地址发送通知。
     */
    private String notifyUrl;

    /**
     * 同步返回地址，用户在支付宝支付完成后会跳转到该地址。
     */
    private String returnUrl;

    /**
     * 初始化支付宝SDK配置的方法。
     * 该方法使用了@PostConstruct注解，确保它在依赖注入完成后执行。
     * 它将配置信息设置到AlipayConfig对象中，并调用Factory.setOptions方法来设置全局选项。
     */
    @PostConstruct
    public void init() {
        // 创建配置对象
        Config config = new Config();

        // 设置协议类型，默认为https
        config.protocol = "https";

        // 设置网关主机地址，这里使用的是沙箱环境的地址
        config.gatewayHost = "openapi-sandbox.dl.alipaydev.com";

        // 设置签名类型，使用RSA2
        config.signType = "RSA2";

        // 设置应用ID，从配置文件中读取
        config.appId = this.appId;

        // 设置应用私钥，从配置文件中读取
        config.merchantPrivateKey = this.appPrivateKey;

        // 设置支付宝公钥，从配置文件中读取
        config.alipayPublicKey = this.alipayPublicKey;

        // 设置异步通知地址，从配置文件中读取
        config.notifyUrl = this.notifyUrl;


        // 将配置对象设置到Factory中，以便在整个应用中使用
        Factory.setOptions(config);

        // 输出初始化成功的消息
        System.out.println("=======支付宝SDK初始化成功=======");
    }
}